/**
 * 自定义一个动态数组
 */
public class MyArray {

    private Object[] data; // 用来保存数组中的内容

    private int size; // 用来记录数组中元素个数

    private int defaultLength = 5; // 数组默认的长度

    // 在构造器中给数组初始化
    public MyArray() {
        this.data = new Object[defaultLength];
    }

    // 从0开始遍历，只要某个位置为null就可以添加成功
    public void add(Object element) {

        // 遍历数组
        for (int i = 0; i < data.length; i++) {
            // 判断当前位置是否为空,为空说明这个位置可以保存元素
            if (data[i] == null) {
                data[i] = element; // 把元素放入指定位置
                size++; // 数组中实际保存元素个数
                return; // 数组位置还够的话就从这里返回了
            }
        }

        // 数组的位置放满了需要扩容，创建新数组它的长度是旧数组的2倍
        Object[] newData = new Object[data.length * 2];

        // 把旧数组中的内容给他复制到新数组中
        for (int i = 0; i < data.length; i++) {
            newData[i] = data[i];
        }
        // 把原本的数组替换成新数组，这里就算数组扩容完成了
        data = newData;

        // 扩容完后 把元素追加进去
        add(element);
    }

    // 返回数组中的元素的个数
    public int getSize() {
        return this.size;
    }

    // 数组没有那么长 ==》越界了
    // 数组这个没有没有值==》长租长度是够的，但是这个位置没有值。

    // 根据索引返回指定的元素
    public Object get(int index) {
        // 索引值小于0或者索引超过元素本身数量
        if (index < 0 || index > size) {
            return null;
        }
        // 直接返回对应的元素
        return data[index];
    }

    // 根据索引进行删除
    public int remove(int index) {

        // 删除的位置没有元素直接返回0
        if (index < 0 || index > size) {
            return 0;
        }

        // 数组中指定的位置没有保存元素
        if (data[index] == null) {
            return 0;
        }

        // 从对应的索引开始找
        for (int i = index; i < data.length; i++) {
            if (data[i] != null) { // 位置元素不为空说明有值
                int x = i + 1; // 找到当前位置的下一个元素
                if (x < data.length) { // 下一个元素不能超过数组的长度，
                    data[i] = data[i + 1]; // 用后面的元素覆盖前面的元素
                } else {
                    data[i] = null; // 这里是处理最后一个元素的，因为前面的都移动了，最后一个就变成null了
                }
            }
        }
        size--;
        return 1;
    }

    // 返回的是数组
    public Object[] getDate() {
        // 把旧数组中元素复制到新数组中，新数组的长度就是size，这样就没有null了
        Object[] newData = new Object[size];
        for (int i = 0; i < newData.length; i++) {
            newData[i] = data[i];
        }
        return newData;
    }
}
